package negocio.servidor.repositorios;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import negocio.beans.Usuario;

import base.ConectorMySql;

public class RepositorioUsuarioMySql implements RepositorioUsuario {

	public static String confirmado = "confirmado";
	public static String pendente = "pendente";
	public static String bloqueado = "bloqueado";
	public static String recusado = "recusado";
	public static String esperando = "esperando";
	public ConectorMySql conector;

	public RepositorioUsuarioMySql() {
		ConectorMySql conector = ConectorMySql.getInstance();
		this.conector = conector;
	}

	@Override
	public void cadastrar(Usuario cliente) {
		String login = cliente.getLogin();
		String senha = cliente.getSenha();
		String nome = cliente.getNome();
		String status = cliente.getStatus();
		String foto = cliente.getFoto();
		long ultimoContato = System.currentTimeMillis();
		int ip = cliente.getIp();


		String sql = "insert into cliente (login,senha,nome,status,foto,ultimoContato,ip) values (" +
						"\'" + login +
						"\', \'" + senha + 
						"\', \'" + nome + 
						"\', \'" + status + 
						"\', \'" + foto + 
						"\', " + ultimoContato + ", " + ip + ")";
		System.out.println(sql);
		conector.executar(sql);
	}

	@Override
	public void atualizar(Usuario cliente) {
		String login = cliente.getLogin();
		String senha = cliente.getSenha();
		String nome = cliente.getNome();
		String status = cliente.getStatus();
		String foto = cliente.getFoto();
		long ultimoContato = System.currentTimeMillis();
		int ip = cliente.getIp();

		String sql = "update cliente set " +
						"senha = \'" + senha + 
						"\', nome = \'" + nome + 
						"\', status = \'" + status + 
						"\', foto = \'" + foto + 
						"\',ultimoContato = \'" + ultimoContato + 
						"\',ip = \'" + ip + 
						"\' where login = \'" + login + "\'";

		conector.executar(sql);
	}

	@Override
	public void remover(Usuario cliente) {
		String login = cliente.getLogin();

		String sql = "delete from Cliente where login = \'" + login + "\'";
		conector.executar(sql);

		String sqld1 = "delete from Amizade where cliente1 = \'" + login + "\'";
		conector.executar(sqld1);

		String sqld2 = "delete from Amizade where cliente2 = \'" + login + "\'";
		conector.executar(sqld2);
	}

	@Override
	public Usuario buscar(Usuario cliente) {
		ResultSet rs;

		String login = cliente.getLogin();
		Usuario clienteAchado = null;

		String sql = "select * from cliente where login = \'" + login + "\'";
		rs = conector.query(sql);
		try {
			if(rs.next())
				clienteAchado = new Usuario(rs.getString("login"), rs.getString("senha"), rs.getString("nome"), rs.getString("status"), rs.getString("foto"), rs.getLong("ultimoContato"), rs.getInt("ip"));
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		return clienteAchado;
	}

	@Override
	public void alterarStatus(Usuario cliente, String status) {
		String login = cliente.getLogin();
		String sql = "update Cliente set status = \'" + status + "\' where login = \'" + login + "\'";
		conector.executar(sql);
	}

	@Override
	public void inserirPedidoAmizade(Usuario cliente1, Usuario cliente2) {
		String login1 = cliente1.getLogin();
		String login2 = cliente2.getLogin();
		String sql1 = "insert into Amizade (cliente1,cliente2,status) values (\'" + login1 + "\',\'" + login2 + "\',\'" + esperando + "\')";
		String sql2 = "insert into Amizade (cliente1,cliente2,status) values (\'" + login2 + "\',\'" + login1 + "\',\'" + pendente + "\')";
		conector.executar(sql1);
		conector.executar(sql2);
	}

	@Override
	public void aprovarAmizade(Usuario cliente1, Usuario cliente2) {
		String login1 = cliente1.getLogin();
		String login2 = cliente2.getLogin();
		String sql = "update Amizade set status = \'" + confirmado + "\' where (cliente1 = \'" + login1 + "\' and cliente2 = \'" + login2 + "\')";
		conector.executar(sql);
		String sql2 = "update Amizade set status = \'" + confirmado + "\' where (cliente2 = \'" + login1 + "\' and cliente1 = \'" + login2 + "\')";
		conector.executar(sql2);
	}

	@Override
	public void recusarPedidoAmizade(Usuario cliente1, Usuario cliente2, boolean paraSempre) {
		String login1 = cliente1.getLogin();
		String login2 = cliente2.getLogin();
		if (paraSempre) {
			String sql = "update Amizade set status = \'" + recusado + "\' where (cliente1 = \'" + login1 + "\' and cliente2 = \'" + login2 + "\')";
			conector.executar(sql);
		} else {
			String sqlr1 = "delete from Amizade where (cliente1 = \'" + login1 + "\' and cliente2 = \'" + login2 + "\')";
			String sqlr2 = "delete from Amizade where (cliente1 = \'" + login2 + "\' and cliente2 = \'" + login1 + "\')";
			conector.executar(sqlr1);
			conector.executar(sqlr2);
		}
	}

	@Override
	public ArrayList<Usuario> buscarPedidosAmizade(Usuario cliente) {
		ResultSet rs;
		ResultSet rs2;
		ArrayList<Usuario> array = new ArrayList<Usuario>();
		String login = cliente.getLogin();
		String sqlBusca = "select cliente2 from Amizade where cliente1 = \'" + login + "\' and status = \'" + pendente + "\'";
		rs = conector.query(sqlBusca);
		try {
			while (rs.next()) {
				String sqlBuscaCliente = "select * from Cliente where login = \'" + rs.getString("cliente2") + "\'";
				rs2 = conector.query(sqlBuscaCliente);
				rs2.next();
				array.add(new Usuario(rs2.getString("login"), rs2.getString("senha"), rs2.getString("nome"), rs2.getString("status"), rs2.getString("foto"), rs2.getLong("ultimoContato"), rs2.getInt("ip")));
				
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return array;
	}

	@Override
	public ArrayList<Usuario> buscarAmigosCliente(Usuario cliente) {
		ResultSet rs;
		ResultSet rs1;
		ResultSet rs2;
		ArrayList<Usuario> array = new ArrayList<Usuario>();
		String login = cliente.getLogin();
		String sqlBusca = "select cliente2,status from Amizade where cliente1 = \'" + login + "\' and (status = \'" + confirmado + "\' or status = \'" + bloqueado + "\')";
		rs = conector.query(sqlBusca);
		try {
			while (rs.next()) {
				String sqlbuscaStatus = "select status from Amizade where cliente1 = \'" + rs.getString("cliente2") + "\' and cliente2 = \'" + login + "\'";
				rs1 = conector.query(sqlbuscaStatus);
				rs1.next();
				String sqlBuscaCliente = "select * from Cliente where login = \'" + rs.getString("cliente2") + "\'";
				rs2 = conector.query(sqlBuscaCliente);
				rs2.next();
				String status = rs1.getString("status");
				if(status.equals(bloqueado))
					status = "offline";
				else
					status = rs2.getString("status");
					
				if(!status.equals("offline"))
					array.add(new Usuario(rs2.getString("login"), rs2.getString("senha"), rs2.getString("nome"), status, rs2.getString("foto"), rs2.getLong("ultimoContato"), rs2.getInt("ip")));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return array;
	}

	@Override
	public ArrayList<Usuario> listarUsuariosOnline() {
		ResultSet rs;
		
		ArrayList<Usuario> array = new ArrayList<Usuario>();

		
		String sql = "select * from cliente where status != \'offline\'";
	
		rs = conector.query(sql);
		
		try {
			while(rs.next()){
				array.add(new Usuario(rs.getString("login"),rs.getString("senha"),rs.getString("nome"),rs.getString("status"),rs.getString("foto"),rs.getLong("ultimoContato"),rs.getInt("ip")));
				
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return array;
	}
}
